home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / 80x0393.zip / VGADRAW.PAS < prev    next >
Pascal/Delphi Source File  |  1993-06-20  |  6KB  |  227 lines

  1. {                                                               }
  2. { Mini VGA Paint Program - Public Domain 1992 by Darren Lyon    }
  3. {                                                               }
  4. {  Simple to use: Completely mouse controlled                   }
  5. {                                                               }
  6. {     Use the left button to draw in foreground, right button   }
  7. {     to draw in background. Middle button selects a new        }
  8. {     colour for each button (click the middle button, and      }
  9. {     then select foreground or background by pressing that     }
  10. {     button. Middle button aborts the colour selection. Hit    }
  11. {     any key to quit.                                          }
  12. {                                                               }
  13. { Requires: VGA, 3-Button mouse, and Turbo Pascal 6             }
  14. {                                                               }
  15. Program VGADraw;
  16.  
  17. uses crt;
  18.  
  19. var savearray : array[0..7999] of byte;
  20.     Colour, BackColour : byte;
  21.     Mouse : record
  22.             X, Y : word;
  23.             Buttons : word;
  24.             end;
  25.     Loop : integer;
  26.  
  27. { Draw a Pixel at (X,Y) in Colour, in 256 colour mode }
  28. Procedure Putpixel(X, Y : Word; Colour : Byte);
  29. Begin
  30.    asm
  31.      mov ax, $A000
  32.      mov es, ax               { Graphics Segment }
  33.      mov ax, Y
  34.      mov dx, ax               { Load Y loc into DX and AX }
  35.      xchg ah, al              { AH := 256 * Y }
  36.      mov cl, 6
  37.      shl dx, cl               { DX := 64 * Y }
  38.      add ax, dx               { AX := 320 * Y }
  39.      mov dx, X
  40.      add ax, dx               { AX := 320 * Y + X }
  41.      mov di, ax               { ES:DI := address of pixel }
  42.      mov ah, Colour           { Load colour }
  43.      mov es:[di], ah;         { Draw pixel }
  44.    end;
  45. end;
  46.  
  47. { Initialize the mouse driver }
  48. Procedure InitMouse;
  49. begin
  50.    asm
  51.      mov ax, 0                { Function 0 }
  52.      int $33
  53.    end;
  54. end;
  55.  
  56. { Show the mouse cursor on the screen }
  57. Procedure ShowMouse;
  58. begin
  59.    asm
  60.      mov ax, 1                { Function 1 }
  61.      int $33
  62.    end;
  63. end;
  64.  
  65. { Remove the mouse cursor from the screen }
  66. Procedure HideMouse;
  67. begin
  68.    asm
  69.      mov ax, 2                { Function 2 }
  70.      int $33
  71.    end;
  72. end;
  73.  
  74. { Return the press state of the mouse buttons }
  75. Procedure MouseButtons;
  76. begin
  77.    asm
  78.      mov ax, 5                { Function 5 }
  79.      mov bx, 0                { All buttons }
  80.      int $33
  81.      mov mouse.buttons, ax
  82.    end;
  83. end;
  84.  
  85. { Find the location of the mouse }
  86. Procedure MouseWhere;
  87. begin
  88.    asm
  89.      mov ax, 3                { Function 3 }
  90.      int $33
  91.      mov mouse.x, cx
  92.      mov mouse.y, dx
  93.    end;
  94. end;
  95.  
  96. { Place the VGA into 320x200 256 colour mode }
  97. Procedure InitGraphics;
  98. begin
  99.    asm
  100.      mov ax, $13              { Mode 13h }
  101.      int $10
  102.    end;
  103. end;
  104.  
  105. { Place the VGA into normal text mode }
  106. Procedure CloseGraphics;
  107. begin
  108.    asm
  109.      mov ax, $3               { Mode 3h }
  110.      int $10
  111.    end;
  112. end;
  113.  
  114. { Read the value of the pixel at offset LOC }
  115. Procedure GetPel(Loc : word; var Colour : byte);
  116. begin
  117.    asm
  118.      mov ax, $A000
  119.      mov es, ax               { Graphics segment }
  120.      mov di, Loc              { ES:DI points to pixel }
  121.      mov ah, es:[di]          { Load pixel }
  122.      lds si, colour           { Load variable address }
  123.      mov ds:[si], ah          { Place into variable }
  124.    end;
  125. end;
  126.  
  127. { Place a pixel on the screen at location LOC in Colour }
  128. Procedure PutPel(Loc : word; Colour : byte);
  129. begin
  130.    asm
  131.      mov ax, $A000
  132.      mov es, ax               { Graphics segment }
  133.      mov di, Loc              { ES:DI points to pixel }
  134.      mov ah, colour           { Load the colour }
  135.      mov es:[di], ah          { Put the pixel on the screen }
  136.    end;
  137. end;
  138.  
  139. { Limit the area the mouse can move to }
  140. Procedure LimitMouse(TopX, TopY, BotX, BotY : word);
  141. begin
  142.    asm
  143.      mov ax,7                 { Function 7 - set X limits }
  144.      mov cx, topx
  145.      mov dx, botx
  146.      int $33
  147.      mov ax,8                 { Function 8 - set Y limits }
  148.      mov cx,topy
  149.      mov dx,boty
  150.      int $33
  151.    end;
  152. end;
  153.  
  154. { Process the selection of a new colour }
  155. Procedure NewColour;
  156. var loop1, loop2, loop3, loop4: integer;
  157. begin
  158.    LimitMouse(0, 0, 319, 19);
  159.  
  160.    { Read the top lines from the screen }
  161.    HideMouse;
  162.    for loop := 0 to 7999 do
  163.        getpel(loop, savearray[loop]);
  164.  
  165.    { Draw the multi-colour boxes }
  166.    for loop1:= 0 to 3 do
  167.       for loop2:= 0 to 63 do
  168.          for loop3:= 0 to 4 do
  169.             for loop4:= 0 to 4 do
  170.                putpixel(loop2*5+loop3, loop1*5+loop4, loop1*64+loop2);
  171.    showmouse;
  172.  
  173.    { Get the mouse button press }
  174.    mouse.buttons := 0;
  175.    while (mouse.buttons <> 4) and (mouse.buttons <> 2) and
  176.          (mouse.buttons <> 1) do
  177.       mousebuttons;
  178.  
  179.    { Find out where they pressed the button }
  180.    mousewhere;
  181.  
  182.    { Process each button }
  183.    if mouse.buttons = 1 then
  184.       colour := (mouse.y) div 5 * 64 + mouse.x div 5
  185.    else if mouse.buttons = 2 then
  186.       backcolour := (mouse.y) div 5 * 64 + mouse.x div 5;
  187.  
  188.    { Draw the top portion back on the screen }
  189.    hidemouse;
  190.    for loop := 0 to 7999 do
  191.        putpel(loop, savearray[loop]);
  192.    showmouse;
  193.    limitmouse(0, 0, 319, 199);
  194. end;
  195.  
  196. { Mainline begin }
  197. begin
  198.    { Set up the screen, mouse, and colours }
  199.    InitGraphics;
  200.    InitMouse;
  201.    LimitMouse(0, 0, 319, 199);
  202.    ShowMouse;
  203.    Colour := 15;
  204.    BackColour := 0;
  205.  
  206.    { Keep going until... }
  207.    repeat
  208.    MouseButtons;
  209.    if Mouse.Buttons = 1 then
  210.       begin
  211.       mousewhere;
  212.       putpixel(mouse.x, mouse.y, colour);
  213.       end
  214.    else if Mouse.Buttons = 2 then
  215.       begin
  216.       mousewhere;
  217.       putpixel( mouse.x, mouse.y, backcolour);
  218.       end
  219.    else if mouse.buttons = 4 then
  220.       begin
  221.       newcolour;
  222.       end;
  223.    until keypressed;      { .... a key is pressed }
  224.  
  225.    CloseGraphics;
  226. end.
  227.